package br.com.equus.bean;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.arquitetura.bean.PaginableBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ConstantesARQ;
import br.com.arquitetura.util.FacesMessagesUtil;
import br.com.arquitetura.util.Mascara;
import br.com.equus.entidade.Entrada;
import br.com.equus.entidade.Fornecedor;
import br.com.equus.entidade.ItemEntrada;
import br.com.equus.entidade.Marca;
import br.com.equus.entidade.Produto;
import br.com.equus.service.EntradaService;
import br.com.equus.util.Constantes;
import br.com.equus.util.ValidacaoUtil;

@ManagedBean(name = "entradaBean")
@ViewScoped
public class EntradaBean extends PaginableBean<Entrada> {

	private static final long serialVersionUID = 1L;

	private Fornecedor fornecedor;

	private List<ItemEntrada> itens;

	private ItemEntrada itemEntrada;

	private ItemEntrada itemEntradaExcluir;

	private Produto produto;

	private Marca marca;

	@ManagedProperty(value = "#{entradaService}")
	protected EntradaService entradaService;

	public EntradaBean() {
		itens = new ArrayList<ItemEntrada>();
		itemEntrada = new ItemEntrada();
		itemEntradaExcluir = new ItemEntrada();
	}

	@Override
	public void verificarAcesso() {
		acessoBean.bloquearTela("ROLE_USER");
	}

	@SuppressWarnings("unchecked")
	public List<Fornecedor> completeFornecedor(String query) {
		List<Fornecedor> sugestoes = new ArrayList<Fornecedor>();
		Fornecedor a = new Fornecedor();
		a.setRazaoSocial(query);
		try {
			sugestoes = this.universalManager.listBy(a, true);
			sugestoes.remove(getModel());
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	public String loadItem() {
		try {
			produto = itemEntrada.getProduto();
			marca = itemEntrada.getMarca();
			itemEntrada.setQuantidadeToString(itemEntrada.getQuantidade().toString());
			itemEntrada.setValorToString(itemEntrada.getValor().toString());
			itemEntrada.setPorcetagemLucroToString(itemEntrada.getPorcetagemLucro().toString());
			itemEntrada.setValorFinalToString(itemEntrada.getValorFinal().toString());
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return SUCCESS;
	}

	public String deleteItem() {
		try {
			if (itemEntradaExcluir.getId() != null) {
				getModel().getItensExcluir().add(itemEntradaExcluir);
			}

			itens.remove(itemEntradaExcluir);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return SUCCESS;
	}

	/**
	 * @return
	 */
	@Override
	public String save() {
		try {
			if (ValidacaoUtil.doubleValido(getModel().getValorTotalToString())) {
				getModel().setValorTotal(Mascara.marcarDouble(getModel().getValorTotalToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Valor Total ", " Está em um formato incorreto");
				return ERROR;
			}
			getModel().setFornecedor(fornecedor);

			if (ValidacaoUtil.doubleValido(getModel().getValorFreteToString())) {
				getModel().setValorFrete(Mascara.marcarDouble(getModel().getValorFreteToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Valor do Frete ", " Está em um formato incorreto");
				return ERROR;
			}

			if (itens == null || itens.isEmpty()) {
				FacesMessagesUtil.addErrorMessage(" ", " É necessário adicionar um item!");
				return ERROR;
			}

			getModel().getItens().addAll(new ArrayList<ItemEntrada>(itens));

			entradaService.save(getModel());

			fornecedor = null;

			limparForm();
			FacesMessagesUtil.addInfoMessage(this.getQualifiedName(), this.getSaveMessage() + " " + ConstantesARQ.COM_SUCESSO);
		} catch (Exception e) {
			FacesMessagesUtil.addErrorMessage(this.getQualifiedName(), ConstantesARQ.ERRO_SALVAR);
			ExcecaoUtil.tratarExcecao(e);
			return ERROR;
		}
		return SUCCESS;
	}

	public void limparForm() {
		setModel(new Entrada());
		itemEntrada = new ItemEntrada();
		itemEntradaExcluir = new ItemEntrada();
		fornecedor = new Fornecedor();
		itens = new ArrayList<ItemEntrada>();
		produto = new Produto();
		marca = new Marca();

	}

	@SuppressWarnings("unchecked")
	public List<Produto> completeProduto(String query) {
		List<Produto> sugestoes = new ArrayList<Produto>();
		Produto a = new Produto();
		a.setDescricao(query);
		try {
			sugestoes = this.universalManager.listBy(a, true);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	@SuppressWarnings("unchecked")
	public List<Marca> completeMarca(String query) {
		List<Marca> sugestoes = new ArrayList<Marca>();
		List<Marca> retorno = new ArrayList<Marca>();
		Marca a = new Marca();
		a.setDescricao(query);
		try {
			sugestoes = this.universalManager.listBy(a, true);
			for (Marca marca : sugestoes) {
				if (marca.getFlgAtivo()) {
					retorno.add(marca);
				}
			}

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return retorno;
	}

	@Override
	public String load() {
		super.load();
		itens.addAll(new ArrayList<ItemEntrada>(getModel().getItens()));

		return SUCCESS;
	}

	public void adicionarItem() {
		try {

			if (produto == null || produto.getId() == null) {
				FacesMessagesUtil.addErrorMessage("Produto ", Constantes.CAMPO_OBRIGATORIO);
				return;
			}
			if (marca == null || marca.getId() == null) {
				FacesMessagesUtil.addErrorMessage("Marca ", Constantes.CAMPO_OBRIGATORIO);
				return;
			}
			if (ValidacaoUtil.doubleValido(itemEntrada.getQuantidadeToString())) {
				itemEntrada.setQuantidade(Mascara.marcarDouble(itemEntrada.getQuantidadeToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Quantidade ", " Está em um formato incorreto");
				return;
			}
			if (ValidacaoUtil.doubleValido(itemEntrada.getValorToString())) {
				itemEntrada.setValor(Mascara.marcarDouble(itemEntrada.getValorToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Valor ", " Está em um formato incorreto");
				return;
			}
			if (ValidacaoUtil.doubleValido(itemEntrada.getPorcetagemLucroToString())) {
				itemEntrada.setPorcetagemLucro(Mascara.marcarDouble(itemEntrada.getPorcetagemLucroToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Porcentagem Lucro (%)", " Está em um formato incorreto");
				return;
			}
			if (ValidacaoUtil.doubleValido(itemEntrada.getValorFinalToString())) {
				itemEntrada.setValorFinal(Mascara.marcarDouble(itemEntrada.getValorFinalToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Valor Final ", " Está em um formato incorreto");
				return;
			}
			if (itemEntrada.getDtValidade() == null) {
				FacesMessagesUtil.addErrorMessage("Data de Validade ", Constantes.CAMPO_OBRIGATORIO);
				return;
			}

			itemEntrada.setProduto(produto);
			itemEntrada.setMarca(marca);
			itemEntrada.setEntrada(getModel());
			if(!itens.contains(itemEntrada)){
				itens.add(itemEntrada);
			}

			itemEntrada = new ItemEntrada();
			produto = new Produto();
			marca = new Marca();

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	public void limparItem() {
		try {
			itemEntrada = new ItemEntrada();
			produto = new Produto();
			marca = new Marca();
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	public void removerItem() {
		try {

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	@Override
	public Entrada createModel() {
		return new Entrada();
	}

	@Override
	public String getQualifiedName() {
		return "Entrada";
	}

	@Override
	public boolean isFeminino() {
		return true;
	}

	@Override
	public Map<String, String> getFilters() {
		return null;
	}

	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public List<ItemEntrada> getItens() {
		return itens;
	}

	public void setItens(List<ItemEntrada> itens) {
		this.itens = itens;
	}

	public ItemEntrada getItemEntrada() {
		return itemEntrada;
	}

	public void setItemEntrada(ItemEntrada itemEntrada) {
		this.itemEntrada = itemEntrada;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public Marca getMarca() {
		return marca;
	}

	public void setMarca(Marca marca) {
		this.marca = marca;
	}

	public ItemEntrada getItemEntradaExcluir() {
		return itemEntradaExcluir;
	}

	public void setItemEntradaExcluir(ItemEntrada itemEntradaExcluir) {
		this.itemEntradaExcluir = itemEntradaExcluir;
	}

	public EntradaService getEntradaService() {
		return entradaService;
	}

	public void setEntradaService(EntradaService entradaService) {
		this.entradaService = entradaService;
	}

}
